package calculadora;

import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;

public class CalculadoraDevengado {
    private LinkedHashMap<Integer,RenglonDevengado> tablaAgenteDevengado;
    private LinkedHashMap<Integer,RenglonDevengado> tablaPromotorDevengado;

    private ArrayList<Integer> llavesAgenteDevengado;
    private ArrayList<Integer> llavesPromotorDevengado;
    
    private Statement st;
    
    private int mesSeleccionado;
    
    public CalculadoraDevengado(int indiceMes, Statement st) {
        this.tablaAgenteDevengado = new LinkedHashMap<Integer,RenglonDevengado>();
        this.tablaPromotorDevengado = new LinkedHashMap<Integer,RenglonDevengado>();
        this.llavesAgenteDevengado = new ArrayList<Integer>();
        this.llavesPromotorDevengado = new ArrayList<Integer>();
        this.mesSeleccionado = indiceMes;
        this.st = st;
    }

    public int getIndiceMesSeleccionado() {
        return mesSeleccionado;
    }

    public ArrayList<Integer> getLlavesAgenteDevengado() {
        return llavesAgenteDevengado;
    }

    public ArrayList<Integer> getLlavesPromotorDevengado() {
        return llavesPromotorDevengado;
    }
    
    public LinkedHashMap<Integer, RenglonDevengado> getTablaAgenteDevengado() {
        return tablaAgenteDevengado;
    }

    public LinkedHashMap<Integer, RenglonDevengado> getTablaPromotorDevengado() {
        return tablaPromotorDevengado;
    }

    /*
     * Ejecuta el query que nos devuelve el acumulado por ramo de cada agente en la base
     * de Datos tomando en cuenta los agentes que no tienen marca o que son DXP y agrega 
     * los datos de los agentes en un hash y un arraylist con los id's de los agentes
     */  
    public void ejecutaQueryAcuAgenteDevengado(Statement st) throws SQLException{
        ResultSet res = null;
        try{
            res = st.executeQuery("SELECT periodo, id_agente, nombre_agente, SUM(imp_pma_riesgo_dev) AS devengado,ramo FROM convenios_pd "
                    + "WHERE marca=0 AND periodo BETWEEN 1 AND "+this.mesSeleccionado+" " 
                    + "GROUP BY periodo,id_agente, nombre_agente, ramo");   
        }
        catch(Exception ex){
            System.err.println("Warning: SELECT " + ex.getMessage());
        }
        
        RenglonDevengado r = null;
        while(res.next()){
            if(this.tablaAgenteDevengado.containsKey(res.getInt("id_agente"))) {
                r = this.tablaAgenteDevengado.get(res.getInt("id_agente"));
            } else {
                r = new RenglonDevengado();
                this.llavesAgenteDevengado.add(res.getInt("id_agente"));
                r.inserta(0, res.getString("id_agente"));
                r.inserta(1, res.getString("nombre_agente"));
            }
            //System.out.println("agente devengado: "+ res.getInt("id_agente") +" valor "+ res.getDouble("devengado"));
            r.insertaDevengado(res.getInt("ramo"), res.getDouble("devengado"));
            this.tablaAgenteDevengado.put(res.getInt("id_agente"), r);
        }
        Iterator<Integer> iterator = this.llavesAgenteDevengado.iterator();
        RenglonDevengado renglon = null;
        String salida = "";
        while(iterator.hasNext()){
            renglon = this.tablaAgenteDevengado.get(iterator.next());
            for(int i=0;i<renglon.getRenglones().length;i++)
                salida += " i : "+renglon.getRenglones()[i];
        }
    }
    
    /*
     * Ejecuta el query que nos devuelve el acumulado por ramo de cada promotor en la base
     * de Datos tomando en cuenta los promotores que no tienen marca o que son DXP y agrega 
     * los datos de los agentes en un hash y un arraylist con los id's de los promotores
     */
    public void ejecutaQueryAcuPromDevengado(Statement st) throws SQLException{
        ResultSet res = null;
        try{
            res = st.executeQuery("SELECT periodo, id_promotoria, promotoria, SUM(imp_pma_riesgo_dev) AS devengado, ramo FROM convenios_pd "
                    + "WHERE marca=0 AND periodo BETWEEN 1  AND "+this.mesSeleccionado+" " 
                    + "GROUP BY periodo,id_promotoria, promotoria, ramo");   
        }
        catch(Exception ex){
            System.err.println("Warning: SELECT " + ex.getMessage());
        }
        RenglonDevengado r = null;
        while(res.next()) {
            if(this.tablaPromotorDevengado.containsKey(res.getInt("id_promotoria"))) {
                r = this.tablaPromotorDevengado.get(res.getInt("id_promotoria"));
            } else {
                r = new RenglonDevengado();
                this.llavesPromotorDevengado.add(res.getInt("id_promotoria"));
                r.inserta(0, res.getString("id_promotoria"));
                r.inserta(1, res.getString("promotoria"));
            }
            r.insertaDevengado(res.getInt("ramo"), res.getDouble("devengado"));
            this.tablaPromotorDevengado.put(res.getInt("id_promotoria"), r);
        }
        Iterator<Integer> iterator = this.llavesPromotorDevengado.iterator();
        RenglonDevengado renglon = null;
        String salida = "";
        while(iterator.hasNext()){
            renglon = this.tablaPromotorDevengado.get(iterator.next());
            for(int i=0;i<renglon.getRenglones().length;i++)
                salida += " i : "+renglon.getRenglones()[i];
        }
    }
    
    public void cargaDevengadosAgente() throws SQLException{
        ejecutaQueryAcuAgenteDevengado(st);
    }
    
    public void cargaDevengadosPromotor() throws SQLException{
        ejecutaQueryAcuPromDevengado(st);
    }
    
    public Double getAcuAutosProm(int id){
        return this.tablaPromotorDevengado.get(id).getAcua();
    }
    
    public Double getAcuDañosProm(int id){
        return this.tablaPromotorDevengado.get(id).getAcud();
    }
    
    public Double getAcuPersonasProm(int id){
        return this.tablaPromotorDevengado.get(id).getAcuv();
    }
    
    public Double getAcuAutosAgen(int id){
        return this.tablaAgenteDevengado.get(id).getAcua();
    }
    
    public Double getAcuDañosAgen(int id){
        return this.tablaAgenteDevengado.get(id).getAcud();
    }
    
    public Double getAcuPersonasAgen(int id){
        return this.tablaAgenteDevengado.get(id).getAcuv();
    }
    
   
}
